package org.example.gxpt.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.example.gxpt.common.result.PageResult;
import org.example.gxpt.common.result.Result;
import org.example.gxpt.pojo.dto.*;
import org.example.gxpt.pojo.entity.User;
import org.example.gxpt.pojo.vo.UserLoginVO;
import org.example.gxpt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@RestController
@RequestMapping("/user")
@Slf4j
@Api(tags = "用户相关接口")
@CrossOrigin
public class UserController {

    @Autowired
    private UserService userService;


    /**
     * 用户登陆
     * @param loginDTO
     * @return
     */
    @PostMapping("/login")
    @ApiOperation("用户登陆")
    public Result userLogin(@RequestBody LoginDTO loginDTO){
        UserLoginVO userLoginVO = userService.login(loginDTO);
        return Result.success(userLoginVO);
    }

    /**
     * 用户注册
     * @param userDTO
     * @return
     */
    @PostMapping("/register")
    @ApiOperation("用户注册")
    public Result userRegister(@RequestBody UserDTO userDTO){

        userService.save(userDTO);
        return Result.success();
    }

    /**
     * 用户数据更新
     * 按照id更新除了状态外的所有信息，提供给上一级管理员使用
     *
     * @param
     * @return
     */
    @PutMapping("/updateById")
    @ApiOperation("根据id进行用户数据更新")
    public Result updateUserById(@RequestBody UserUpdateDTO userUpdateDTO){

        userService.updateById(userUpdateDTO);
        return Result.success();
    }

    /**
     * 用户数据更新
     * 按照上下文更新用户数据，提供给用户自己使用
     *
     * @param
     * @return
     */
    @PutMapping("/updateByContext")
    @ApiOperation("修改当前登录用户的数据")
    public Result updateUserByContext(@RequestBody UserUpdateDTO userUpdateDTO){
        userService.updateByContext(userUpdateDTO);
        return Result.success();
    }

    /**
     * 用户分页查询
     * @param userPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("用户分页查询")
    public Result<PageResult> userPageQuery(UserPageQueryDTO userPageQueryDTO){
        return Result.success(userService.pageQuery(userPageQueryDTO));
    }

    /**
     * 根据用户id查询数据
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据用户id查询数据")
    public Result<User> getUserById(@PathVariable Long id){
        return Result.success(userService.getById(id));
    }

    /**
     * 用户登出
     * @return
     */
    @PostMapping("/logout")
    @ApiOperation("用户登出")
    public Result logout() {
        return userService.logout();
    }

    /**
     * 用户状态更新
     * @param
     * @return
     */
    @PostMapping("/updateStatus")
    @ApiOperation("用户状态更新")
    public Result updateStatus(@RequestBody UpdateStatusDTO updateStatusDTO){
        userService.updateStatus(updateStatusDTO.getId(), updateStatusDTO.getStatus());
        return Result.success();
    }

    @DeleteMapping("/{id}")
    @ApiOperation("用户数据删除")
    public Result deleteUserById(@PathVariable Long id){
        userService.deleteUserById(id);
        return Result.success();
    }

    @GetMapping("/listall")
    @ApiOperation("全部用户数据")
    public Result<List<User>> listAll(){
        return Result.success(userService.listAll());
    }


}
